#ifndef HTTP_UTIL_H
#define HTTP_UTIL_H

#include <string>
#include <vector>
#include <unordered_map>
#include <fstream>
#include <sys/stat.h>

namespace http {

/**
 * @brief HTTP协议处理工具类
 * 提供URL编码/解码、文件操作、MIME类型映射等功能
 */
class HttpUtil 
{
public:
    /**
     * @brief 将字符串按分隔符分割为多个子串
     * @param src 源字符串
     * @param sep 分隔符
     * @param arry 存储结果的向量
     * @return 分割后的子串数量
     */
    static size_t split(const std::string &src, const std::string &sep, std::vector<std::string> *arry);

    /**
     * @brief 读取文件全部内容
     * @param filename 文件名
     * @param buf 存储内容的字符串
     * @return 成功返回true，失败返回false
     */
    static bool readFile(const std::string &filename, std::string *buf);

    /**
     * @brief 写入内容到文件
     * @param filename 文件名
     * @param buf 待写入的内容
     * @return 成功返回true，失败返回false
     */
    static bool writeFile(const std::string &filename, const std::string &buf);

    /**
     * @brief URL编码（将特殊字符转换为%HH格式）
     * @param url 待编码的URL
     * @param convert_space_to_plus 是否将空格转换为+
     * @return 编码后的URL
     */
    static std::string urlEncode(const std::string url, bool convert_space_to_plus = true);
    /**
     * @brief URL解码（将%HH格式还原为原始字符）
     * @param url 待解码的URL
     * @param convert_plus_to_space 是否将+转换为空格
     * @return 解码后的URL
     */
    static std::string urlDecode(const std::string url, bool convert_plus_to_space = true);

    /**
     * @brief 获取HTTP状态码描述
     * @param statu 状态码
     * @return 状态码描述字符串
     */
    static std::string statuDesc(int statu);

    /**
     * @brief 根据文件扩展名获取MIME类型
     * @param filename 文件名
     * @return MIME类型字符串
     */
    static std::string extMime(const std::string &filename);

    /**
     * @brief 判断文件是否为目录
     * @param filename 文件名
     * @return 是目录返回true，否则返回false
     */
    static bool isDirectory(const std::string &filename);

    /**
     * @brief 判断文件是否为普通文件
     * @param filename 文件名
     * @return 是普通文件返回true，否则返回false
     */
    static bool isRegular(const std::string &filename);

    /**
     * @brief 验证HTTP请求路径的有效性（防止目录遍历攻击）
     * @param path 请求路径
     * @return 有效返回true，否则返回false
     */
    static bool validPath(const std::string &path);

private:
    /**
     * @brief 内部工具：将十六进制字符转换为整数
     */
    static char hexToI(char c);
};

} // namespace http

#endif // HTTP_UTIL_H